/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/20 18:50
 */

//在单色位图图像中，构成图像的每个像素都具有0或1的颜色信息。
//对于色位图图像，创建时图像已经确定了图像的大小和构成图像的所有像素的信息。
//现在我们想将图像放大，而放大图像的最简单的方法是在保持现有像素排列的情况下，平均增加每个像素的数量。
//当给定构成一个长度为的单色位图图像的所有像素的信息时，图片的宽度和高度增加倍时，放大方式如下图所示：
//
//输入描述
//  第一行给出正方形单色位图的水平/垂直长度n和用于放大图像的倍数k。
//  在第二行到第行中，每行给出个像素的信息。
//输出描述
//  输出放大的单色位图图像的像素信息。
//
//示例 1
//输入
//2 2
//0 1
//1 0
//输出
//0 0 1 1
//0 0 1 1
//1 1 0 0
//1 1 0 0
//说明
//  将每个像素放大2倍就是输出后的图形
//
//示例 2
//输入
//3 3
//1 0 1
//0 0 0
//1 0 1
//输出
//1 1 1 0 0 0 1 1 1
//1 1 1 0 0 0 1 1 1
//1 1 1 0 0 0 1 1 1
//0 0 0 0 0 0 0 0 0
//0 0 0 0 0 0 0 0 0
//0 0 0 0 0 0 0 0 0
//1 1 1 0 0 0 1 1 1
//1 1 1 0 0 0 1 1 1
//1 1 1 0 0 0 1 1 1
//说明
//  将每个像素放大3倍就是输出后的图形

#include <iostream>

using namespace std;

int main() {
    int n, k;
    scanf("%d%d", &n, &k);

    int a[n * k][n * k];

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            int x;
            scanf("%d", &x);
            for (int l = 0; l < k; ++l) {
                for (int m = 0; m < k; ++m) {
                    a[i * k + l][j * k + m] = x;
                }
            }
        }
    }

    for (int i = 0; i < n * k; ++i) {
        for (int j = 0; j < n * k; ++j) {
            printf("%d ", a[i][j]);
        }
        puts("");
    }

    return 0;
}
